/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;


import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;
import java.util.NoSuchElementException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import modelo.ModeloTablaPedidos;
import persistencia.PedidosDAO;
import pojos.Albaran;
import pojos.Facturas;
import pojos.Lineasalb;
import pojos.Lineasfact;
import pojos.Lineasped;
import pojos.Pedido;


/**
 *
 * @author alejandrolopezdelolmo
 */
public class PanelGestionPedidos extends javax.swing.JPanel {

    
    /**
     * Creates new form PanelSearchBook
     */
    JPanel panelPadre;
    PedidosDAO administradorPedidos=new PedidosDAO();
    List<String> nombreColumnas=new LinkedList();
    
    public PanelGestionPedidos() {
        initComponents();
        rellenarListaNombresColumnas();
        rellenarComboBoxPedidos();
        realizarBusqueda();
        
        
           
        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPfiltros = new javax.swing.JPanel();
        jChBCodPedido = new javax.swing.JCheckBox();
        jCBpedidos = new javax.swing.JComboBox();
        jChBestadoPedido = new javax.swing.JCheckBox();
        jCBestado = new javax.swing.JComboBox();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTresultados = new javax.swing.JTable();
        jToolBar = new javax.swing.JToolBar();
        jBnuevoPedido = new javax.swing.JButton();
        jBmodificarPedido = new javax.swing.JButton();
        jBeliminarPedido = new javax.swing.JButton();
        jBrecepcionarPedido = new javax.swing.JButton();
        jBvisualizarAlbaran = new javax.swing.JButton();
        jBbuscar = new javax.swing.JButton();

        addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                formFocusGained(evt);
            }
        });

        jPfiltros.setBorder(javax.swing.BorderFactory.createTitledBorder("Filtros de Búsqueda"));
        jPfiltros.setLayout(new java.awt.GridLayout(2, 2));

        jChBCodPedido.setText("Código de Pedido");
        jPfiltros.add(jChBCodPedido);

        jCBpedidos.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        jPfiltros.add(jCBpedidos);

        jChBestadoPedido.setText("Estado de Pedido");
        jPfiltros.add(jChBestadoPedido);

        jCBestado.setMaximumRowCount(2);
        jCBestado.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Sin Recepcionar", "Recepcionado", " " }));
        jPfiltros.add(jCBestado);

        jPanel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        jPanel1.setLayout(new java.awt.GridLayout(1, 0));

        jTresultados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTresultados);

        jPanel1.add(jScrollPane1);

        jToolBar.setFloatable(false);
        jToolBar.setRollover(true);

        jBnuevoPedido.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/ico_plus.png"))); // NOI18N
        jBnuevoPedido.setToolTipText("Nuevo Pedido");
        jBnuevoPedido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBnuevoPedidoActionPerformed(evt);
            }
        });
        jToolBar.add(jBnuevoPedido);

        jBmodificarPedido.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/ico_edit2.png"))); // NOI18N
        jBmodificarPedido.setToolTipText("Modificar Pedido");
        jBmodificarPedido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBmodificarPedidoActionPerformed(evt);
            }
        });
        jToolBar.add(jBmodificarPedido);

        jBeliminarPedido.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/ico_bin.png"))); // NOI18N
        jBeliminarPedido.setToolTipText("Eliminar Pedido");
        jBeliminarPedido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBeliminarPedidoActionPerformed(evt);
            }
        });
        jToolBar.add(jBeliminarPedido);

        jBrecepcionarPedido.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/ico_edit1.png"))); // NOI18N
        jBrecepcionarPedido.setToolTipText("Recepecionar Pedido");
        jBrecepcionarPedido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBrecepcionarPedidoActionPerformed(evt);
            }
        });
        jToolBar.add(jBrecepcionarPedido);

        jBvisualizarAlbaran.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/ico_find.png"))); // NOI18N
        jBvisualizarAlbaran.setToolTipText("Visualizar Albarán de Pedido");
        jBvisualizarAlbaran.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBvisualizarAlbaranActionPerformed(evt);
            }
        });
        jToolBar.add(jBvisualizarAlbaran);

        jBbuscar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/ico_find.png"))); // NOI18N
        jBbuscar.setToolTipText("Realizar Busqueda de Pedidos");
        jBbuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBbuscarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 772, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jToolBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addGap(143, 143, 143)
                .addComponent(jPfiltros, javax.swing.GroupLayout.PREFERRED_SIZE, 464, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jBbuscar)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jToolBar, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(jPfiltros, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(55, 55, 55)
                        .addComponent(jBbuscar)))
                .addGap(61, 61, 61)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void jBnuevoPedidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBnuevoPedidoActionPerformed
        JDialogAddPedido jdAddPedido=new JDialogAddPedido(this,administradorPedidos);
        jdAddPedido.setVisible(true);
        refrescarComboBox();
        realizarBusqueda();
    }//GEN-LAST:event_jBnuevoPedidoActionPerformed

    private void jBmodificarPedidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBmodificarPedidoActionPerformed
        modificarPedido();
    }//GEN-LAST:event_jBmodificarPedidoActionPerformed

    private void jBbuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBbuscarActionPerformed
        realizarBusqueda();
    }//GEN-LAST:event_jBbuscarActionPerformed

    private void jBrecepcionarPedidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBrecepcionarPedidoActionPerformed
       recepcionarPedido();
    }//GEN-LAST:event_jBrecepcionarPedidoActionPerformed

    private void jBeliminarPedidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBeliminarPedidoActionPerformed
        eliminarPedido();
        refrescarComboBox();
    }//GEN-LAST:event_jBeliminarPedidoActionPerformed

    private void jBvisualizarAlbaranActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBvisualizarAlbaranActionPerformed
       try{ 
        consultarAlbaranPedido();
       }catch(NoSuchElementException e)
       {
           JOptionPane.showMessageDialog(this,"No puedes visualizar un albarán de un pedido sin recepcionar","Error al visualizar",JOptionPane.ERROR_MESSAGE);
       }
    }//GEN-LAST:event_jBvisualizarAlbaranActionPerformed

    private void formFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusGained
        refrescarComboBox();
    }//GEN-LAST:event_formFocusGained

   
    //ESTE METODO RELLENA EL COMBO BOX CON TODOS LOS CODIGOS DE PEDIDO
    private void rellenarComboBoxPedidos()
    {
        List<Integer> listaCodigos=this.administradorPedidos.getCodigosPedidos();
        
        DefaultComboBoxModel modeloCodPedidos=new DefaultComboBoxModel();
        
        for (int i = 0; i < listaCodigos.size(); i++) {
            modeloCodPedidos.addElement(listaCodigos.get(i));
            
        }
        
        this.jCBpedidos.setModel(modeloCodPedidos);
    }
    
    //ESTE METODO REALIZA UNA BUSQUEDA EN FUNCION DE UNOS REQUISITOS
     private void realizarBusqueda()
    {
        boolean checkCodpedido=this.jChBCodPedido.isSelected();
        boolean checkEstado=this.jChBestadoPedido.isSelected();
        Integer codPedido=(Integer)this.jCBpedidos.getSelectedItem();
        Integer estado=this.jCBestado.getSelectedIndex();
        List<Pedido> listaPedidos;
        
        
        if(checkCodpedido && checkEstado)
        {
            listaPedidos=this.administradorPedidos.getPedidoPorCodYEstado(codPedido,estado);
        }
        else if(checkCodpedido && !checkEstado)
        {
            listaPedidos=this.administradorPedidos.getPedidoporCodigo(codPedido);
        }
        else if(!checkCodpedido && checkEstado)
        {
            listaPedidos=this.administradorPedidos.getPedidosPorEstado(estado);
        }
        else{
            listaPedidos=this.administradorPedidos.getPedidos();
        }
        
        this.jTresultados.setModel(new ModeloTablaPedidos(listaPedidos,nombreColumnas));
    }
     
     //ESTE METODO RELLENA LA LISTA DE LOS NOMBRES DE LAS COLUMNAS
     private void rellenarListaNombresColumnas()
     {
         this.nombreColumnas.add("CÓDIGO DE PEDIDO");
         this.nombreColumnas.add("CÓDIGO DE CLIENTE");
         this.nombreColumnas.add("IMPORTE DE PEDIDO");
         this.nombreColumnas.add("ESTADO DE PEDIDO");
     }

     //ESTE METODO RECEPCIONA UN PEDIDO
     private void recepcionarPedido()
     {
         int registroSeleccionado=this.jTresultados.getSelectedRow();
         
         
         //HAS PULSADO UNA FILA DE LA TABLA
         if(registroSeleccionado!=-1)
         {
             //RECOGEMOS EL VALOR DE LA COLUMNA 3 QUE CONTIENE EL ESTADO DE LA FILA SELECCIONADA
             String estadoPedido=(String)this.jTresultados.getValueAt(registroSeleccionado, 3);
             
             //SI EL PEDIDO YA ESTA RECEPCIONADO
             if(estadoPedido.equals("RECEPCIONADO"))
             {
                 JOptionPane.showMessageDialog(this,"No puedes recepcionar un pedido ya recepcionado","Error al recepcionar",JOptionPane.ERROR_MESSAGE);
             }
             //SI NO SE RECEPCIONA
             else{
                 //COGEMOS EL CODIGO DEL PEDIDO A RECEPCIONAR
                 Integer codPedidoRecepcionar=(Integer)this.jTresultados.getValueAt(registroSeleccionado, 0);
                 Pedido pedidoRecepcionar=(Pedido)this.administradorPedidos.getPedidoporCodigo(codPedidoRecepcionar).get(0);
                 pedidoRecepcionar.setRecepcionado(1);
                 
                 Albaran nuevoAlbaran=new Albaran(pedidoRecepcionar.getCliente(),pedidoRecepcionar,pedidoRecepcionar.getImporteTotal());
                
                 Facturas nuevaFactura=new Facturas(nuevoAlbaran,nuevoAlbaran.getCliente(),nuevoAlbaran.getImporteTotal());
                 
                 pedidoRecepcionar.addAlbaran(nuevoAlbaran);
                 nuevoAlbaran.addFactura(nuevaFactura);
                 
                 //LINEAS DE FACTURA Y ALBRAN
                 Iterator iterador=pedidoRecepcionar.getLineaspeds().iterator();
                 
                 while(iterador.hasNext())
                 {
                    //RECOGER LA PRIMERA LINEA DE PEDIDO
                    Lineasped lineaRecuperada=(Lineasped)iterador.next();
                    
                    Lineasalb LineasAlbaran=new Lineasalb(nuevoAlbaran,lineaRecuperada.getArticulos(),lineaRecuperada.getDescripcion(),lineaRecuperada.getCantidad(),lineaRecuperada.getImporte());
                    Lineasfact lineaFactura=new Lineasfact(lineaRecuperada.getArticulos(),nuevaFactura,lineaRecuperada.getDescripcion(),lineaRecuperada.getCantidad(),lineaRecuperada.getImporte());
                    
                    //AÑADIR LAS LINEAS A SUS PADRES
                    nuevoAlbaran.addLinea(LineasAlbaran);
                    nuevaFactura.addLinea(lineaFactura);
                     
                 }
                 
                 //ACTUALIZAR EL PADRE
                 this.administradorPedidos.updatePedido(pedidoRecepcionar);
                 
                 JOptionPane.showMessageDialog(this,"El pedido ha sido recepcionado con éxito","Rececpción Completada",JOptionPane.INFORMATION_MESSAGE);
                 realizarBusqueda();
                 
             }
         }
         //NO HAS PULSADO NINGUNA FILA Y registroSeleccionado ES IGUAL A -1
         else{
             JOptionPane.showMessageDialog(this,"Debes seleccionar un pedido de la tabla para poder recepcionarlo","Error al recepcionar",JOptionPane.ERROR_MESSAGE);
         }
     }

     //ESTE METODO PERMITE MODIFICAR UN PEDIDO, SI NO HA SIDO RECEPCIONADO
     private void modificarPedido()
     {
        int registroSeleccionado=this.jTresultados.getSelectedRow();
        
        if(registroSeleccionado!=-1)
        {
            //RECOGEMOS EL VALOR DE LA COLUMNA 3 QUE CONTIENE EL ESTADO DE LA FILA SELECCIONADA
             String estadoPedido=(String)this.jTresultados.getValueAt(registroSeleccionado, 3);
             
             //SI EL PEDIDO YA ESTA RECEPCIONADO NO PODREMOS MODIFICARLO
             if(estadoPedido.equals("RECEPCIONADO"))
             {
                 JOptionPane.showMessageDialog(this,"No puedes modificar un pedido ya recepcionado","Error al modificar",JOptionPane.ERROR_MESSAGE);
             }
             //SI NO SE MODIFICA
             else{
                 //COGEMOS EL CODIGO DEL PEDIDO A RECEPCIONAR
                 Integer codPedidoModificar=(Integer)this.jTresultados.getValueAt(registroSeleccionado, 0);
                 Pedido pedidoModificar=this.administradorPedidos.getPedidoporCodigo(codPedidoModificar).get(0);
                 JDialogUpdatePedido jdUpdatePedido=new JDialogUpdatePedido(this,pedidoModificar,administradorPedidos);
                 jdUpdatePedido.setVisible(true);
                 
             }
            
        
        }
        else{
            JOptionPane.showMessageDialog(this,"Debes seleccionar un pedido de la tabla para poder modificarlo","Error al modificar",JOptionPane.ERROR_MESSAGE);
        }
         
       
     }
     
     //ESTE METODO ELIMINA COMPLETAMENTE UN PEDIDO Y TODAS SUS RELACIONES DE LA BASE DE DATOS
     private void eliminarPedido()
     {
        int registroSeleccionado=this.jTresultados.getSelectedRow();
        
        if(registroSeleccionado!=-1)
        {
            //RECOGEMOS EL VALOR DE LA COLUMNA 3 QUE CONTIENE EL ESTADO DE LA FILA SELECCIONADA
             String estadoPedido=(String)this.jTresultados.getValueAt(registroSeleccionado, 3);
             
             //SI EL PEDIDO YA ESTA RECEPCIONADO NO PODREMOS ELIMINARLO
             if(estadoPedido.equals("RECEPCIONADO"))
             {
                 JOptionPane.showMessageDialog(this,"No puedes eliminar un pedido ya recepcionado","Error al eliminar",JOptionPane.ERROR_MESSAGE);
             }
             //SI NO, SE ELIMINA
             else{
                int opcion=JOptionPane.showConfirmDialog(this,"¿Estas seguro que deseas eliminar este pedido?","Eliminar pedido",JOptionPane.INFORMATION_MESSAGE);
                
                if(opcion==JOptionPane.OK_OPTION)
                {
                    Integer codPedidoEliminar=(Integer)this.jTresultados.getValueAt(registroSeleccionado, 0);
                    
                    
                   
                    //OBJETOS QUE SE VAN A ELIMINAR DE LA BASE DE DATOS
                    Pedido pedidoEliminar=this.administradorPedidos.getPedidoporCodigo(codPedidoEliminar).get(0);
                    this.administradorPedidos.removePedido(pedidoEliminar);
                  
                    JOptionPane.showMessageDialog(this,"El pedido ha sido eliminado con éxito","Eliminación completada",JOptionPane.INFORMATION_MESSAGE);
                    realizarBusqueda();
                }
                 
             }
        }
        else{
            JOptionPane.showMessageDialog(this,"DEBES SELECCIONAR UN PEDIDO DE LA TABLA PARA PODER ELIMINARLO","ERROR AL ELIMINAR",JOptionPane.ERROR_MESSAGE);
        }
     }
     
     private void consultarAlbaranPedido()
     {
         int registroSeleccionado=this.jTresultados.getSelectedRow();
        
        if(registroSeleccionado!=-1)
        {

                 //COGEMOS EL CODIGO DEL PEDIDO A RECEPCIONAR
                 Integer codPedidoVisualizar=(Integer)this.jTresultados.getValueAt(registroSeleccionado, 0);
                 Pedido pedidoModificar=this.administradorPedidos.getPedidoporCodigo(codPedidoVisualizar).get(0);
                 Albaran albaranVisualizar=(Albaran)pedidoModificar.getAlbarans().iterator().next();
                 JDialogVisualizarAlbaran jdVisualizarAlbaran=new JDialogVisualizarAlbaran(this,albaranVisualizar);
                 jdVisualizarAlbaran.setVisible(true);
        }
        else{
            JOptionPane.showMessageDialog(this,"Debes seleccionar un pedido de la tabla para poder visualizar su albarán","Error al visualizar",JOptionPane.ERROR_MESSAGE);
        }
     }
     
    private void refrescarComboBox()
    {
        this.jCBpedidos.removeAllItems();
        rellenarComboBoxPedidos();
    }
     
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jBbuscar;
    private javax.swing.JButton jBeliminarPedido;
    private javax.swing.JButton jBmodificarPedido;
    private javax.swing.JButton jBnuevoPedido;
    private javax.swing.JButton jBrecepcionarPedido;
    private javax.swing.JButton jBvisualizarAlbaran;
    private javax.swing.JComboBox jCBestado;
    private javax.swing.JComboBox jCBpedidos;
    private javax.swing.JCheckBox jChBCodPedido;
    private javax.swing.JCheckBox jChBestadoPedido;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPfiltros;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JToolBar jToolBar;
    public javax.swing.JTable jTresultados;
    // End of variables declaration//GEN-END:variables
}
